import time
import random

from DrissionPage import ChromiumPage
from DrissionPage._pages.chromium_tab import ChromiumTab
from DrissionPage.common import Actions
from DrissionPage.errors import *

import common.risk.cloudflare as cloudflare
import lib.utils.log_loader as log_loader
from lib.utils.config_loader import load_config
import common.chrome.launcher as chrome_launcher
from lib.utils.redis_util import get_redis_client
from common.data.element_selectors import CHAT_TITLE, PROMPT_TEXTAREA_SELECTOR, SEND_BUTTON_SELECTOR, LOAD_CHATGPT_TIME, \
    CHAT_STATE, CHAT_RECORDS_LAST


def is_chat_page(tab: ChromiumTab):
    """
    判断当前tab是否是聊天页面。

    :param tab: ChromiumTab对象，代表一个浏览器标签页。
    :return: 布尔值，如果是聊天页面则返回True，否则返回False。
    """
    logger = log_loader.get_logger()  # 获取日志记录器
    # logger.debug(f'检查聊天元素')  # 记录开始检查聊天页面的日志
    if CHAT_TITLE == tab.title.strip():  # 检查页面标题是否为ChatGPT
        try:
            prompt_textarea = tab.ele(PROMPT_TEXTAREA_SELECTOR)  # 尝试获取输入框元素
            send_button = tab.ele(SEND_BUTTON_SELECTOR)  # 尝试获取发送按钮元素
            # 判断元素内容是否充实，以确认元素存在且页面是聊天页面
            if len(prompt_textarea.html) > 20 and len(send_button.html) > 20:
                return True
            else:
                return False
        except ElementNotFoundError:
            return False  # 如果找不到元素，认为不是聊天页面
        except Exception as e:
            return False  # 捕获其他异常，安全返回False
    else:
        return False  # 如果页面标题不是ChatGPT，直接返回False


def save_chatgpt_interaction():
    """
    保存最后一次和ChatGPT交互的时间
    """
    redis_client = get_redis_client()  # 获取Redis客户端
    current_timestamp = int(time.time())  # 获取当前时间戳
    redis_client.set(LOAD_CHATGPT_TIME, current_timestamp)  # 将当前时间戳保存到Redis中，键为LOAD_CHATGPT_TIME


def check_chatgpt_interaction():
    """
    检查是否超过5分钟没有和ChatGPT交互
    返回值:
        - True: 如果在5分钟内加载过ChatGPT
        - False: 如果超过5分钟没有加载ChatGPT
    """
    redis_client = get_redis_client()  # 获取Redis客户端
    current_timestamp = int(time.time())  # 获取当前时间戳
    save_time_str = redis_client.get(LOAD_CHATGPT_TIME)  # 从Redis中获取上次加载ChatGPT的时间戳

    # 检查save_time_str是否为None
    if save_time_str is None:
        return False  # 如果LOAD_CHATGPT_TIME不存在，认为超过5分钟没有加载ChatGPT

    save_time = int(save_time_str)  # 将字符串转换为整数
    # 判断是否超过5分钟没有加载ChatGPT
    if current_timestamp - save_time > random.randint(5, 8) * 60:
        return False
    else:
        return True


def is_new_chat():
    """
    检查是否是新聊天
    返回值:
        - True: 如果是新聊天
        - False: 如果不是新聊天
    """
    redis_client = get_redis_client()
    new_chat_state_str = redis_client.get(CHAT_STATE)
    if new_chat_state_str is None:
        save_new_chat()
        return True
    else:
        new_chat_state = int(new_chat_state_str)
        if new_chat_state == 1:
            return True
        else:
            return False


def update_chat_state():
    """
    更新聊天状态
    """
    redis_client = get_redis_client()
    redis_client.set(CHAT_STATE, 2, ex=300)


def save_new_chat():
    """
    设置新聊天状态
    """
    redis_client = get_redis_client()  # 获取Redis客户端实例

    # 设置Redis中聊天状态的键值对，并设置过期时间为300秒（5分钟）
    redis_client.set(CHAT_STATE, 1, ex=300)

    current_timestamp = int(time.time())  # 获取当前时间的时间戳

    # 设置并保存最新的聊天记录时间戳到Redis，方便提取最后一次对话聊天记录
    # 这个地方取出的key是聊天记录的文件名
    redis_client.set(CHAT_RECORDS_LAST, current_timestamp)
